package com.uaf.vxalipaybill.provider.utils;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.uaf.api.vo.resp.BaseRespVo;
import com.uaf.common.response.utils.ResponseUtils;
import com.uaf.log.MySlf4j;
import com.uaf.vxalipaybill.api.exception.VxAlipayBillException;
import com.uaf.vxalipaybill.api.exception.VxAlipayBillServiceException;

/**
 * @filename VxAlipayBillGlobalExceptionHandler.java
 * @description 全局异常类
 * @author 马庆智
 * @date 2021/9/15 11:06
 */
@ControllerAdvice
@Component
public class VxAlipayBillGlobalExceptionHandler {

	/**
	 * 功能描述  捕捉全局异常-系统异常
	 * @param e 统一异常类
	 * @param <T>	方法声明
	 * @return java.lang.String
	 * @author 马庆智
	 * @date 2021/9/9 17:11
	 */
	@ExceptionHandler(value = Exception.class)
	@ResponseBody
	public <T> BaseRespVo<T> handleException(Exception e) {
		MySlf4j.textInfo("服务异常，异常信息:{0}", MySlf4j.ExceptionToString(e));
		return ResponseUtils.responseMsg(VxAlipayBillException.ERR_100000, "系统异常", null);
	}

	/**
	 * 功能描述  捕捉全局异常-自定义异常
	 * @param e    自定义异常类
	 * @param <T>	方法声明
	 * @return com.uaf.api.vo.resp.BaseRespVo<org.apache.poi.ss.formula.functions.T>
	 * @author马庆智
	 * @date 2021/9/9 17:11
	 */
	@ExceptionHandler(value = VxAlipayBillServiceException.class)
	@ResponseBody
	public <T> BaseRespVo<T> handleVxAlipayBillServiceException(VxAlipayBillServiceException e) {
		MySlf4j.textInfo("请求异常，异常代码:{0},异常信息:{1}", e.getCode(), e.getMessage());
		return ResponseUtils.responseMsg(e.getCode(), e.getMessage(), null);
	}

	/**
	 * 功能描述 统一参数校验
	 * @param req    请求参数
	 * @param e        异常信息
	 * @param <T>	方法声明
	 * @return com.uaf.api.vo.resp.BaseRespVo<org.apache.poi.ss.formula.functions.T>
	 * @author 马庆智
	 * @date 2021/9/9 17:11
	 */
	@ExceptionHandler(value = MethodArgumentNotValidException.class)
	@ResponseBody
	public <T> BaseRespVo<T> handleMethodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException e) {
		BindingResult bindingResult = e.getBindingResult();
		StringBuilder errorMesssage = new StringBuilder("缺少必要的参数:");
		for (FieldError fieldError : bindingResult.getFieldErrors()) {
			errorMesssage.append(fieldError.getDefaultMessage() + ";");
		}
		MySlf4j.textError("统一参数校验异常，异常代码:{0},异常信息:{1}", VxAlipayBillException.ERR_100003, errorMesssage.toString());
		return ResponseUtils.responseMsg(VxAlipayBillException.ERR_100003, errorMesssage.toString(), null);
	}

}
